//
//  ZYCppExceptionHandler.h
//  ZYWebImage
//
//  Created by wangzhipan on 2025/5/3.
//  处理C++异常

#import <Foundation/Foundation.h>

/*
 ## 基本原理
 1. 异常抛出机制 ：
    
    - 使用 throw 关键字抛出异常对象
    - 异常对象可以是任何类型（基本类型、类对象等）
    - 抛出异常后，程序会立即停止当前函数的执行
 2. 异常传播 ：
    
    - 异常会沿着调用栈向上传播
    - 如果当前函数没有处理异常，控制权会返回到调用者
    - 这个过程称为"栈展开"(stack unwinding)
 3. 异常捕获 ：
    
    - 使用 try-catch 块捕获异常
    - catch 块可以指定要捕获的异常类型
    - 可以有多个 catch 块处理不同类型的异常
 4. 未捕获异常处理 ：
    
    - 如果异常没有被任何 catch 块捕获，程序会调用 std::terminate()
    - std::terminate() 默认会调用 abort() 终止程序
    - 可以通过 std::set_terminate() 设置自定义的终止处理函数
 ## 底层实现
 1. 异常表 ：
    
    - 编译器为每个函数生成异常表(exception table)
    - 表中包含 try 块的范围和对应的 catch 处理器位置
 2. 栈展开过程 ：
    
    - 抛出异常时，运行时系统查找当前函数的异常表
    - 如果找到匹配的 catch 处理器，跳转到该处理器
    - 如果没有找到，调用析构函数清理局部对象，然后返回到调用者继续查找
 3. RTTI 机制 ：
    
    - 运行时类型识别(RTTI)用于确定异常对象的实际类型
    - 通过 typeid 操作符和 dynamic_cast 实现
    - 这也是为什么异常捕获可以支持多态
 4. 异常对象生命周期 ：
    
    - 异常对象通常在堆上创建副本
    - 在异常处理完成后自动销毁
    - 这确保了即使在栈展开过程中，异常对象仍然有效
 ## 自定义异常处理
 1. terminate_handler ：
    
    - 通过 std::set_terminate() 设置自定义终止处理函数
    - 在未捕获异常或异常处理过程中发生错误时被调用
    - 可以在这里收集崩溃信息，如我们的 ZYCppExceptionHandler
 2. unexpected_handler ：
    
    - 在 C++98 中，当函数抛出了其异常规范未声明的异常类型时调用
    - 在 C++11 后已被弃用，C++17 中完全移除
 3. noexcept 说明符 ：
    
    - 在 C++11 引入，用于指定函数不会抛出异常
    - 如果 noexcept 函数抛出异常，会直接调用 std::terminate()
 */

NS_ASSUME_NONNULL_BEGIN

@interface ZYCppExceptionHandler : NSObject
- (BOOL)install;
- (void)uninstall;
@end

NS_ASSUME_NONNULL_END


